import sys
import re
import os

def count_characters(text):
    """统计字符数（包括空格和换行符）"""
    return len(text)

def count_words(text):
    """统计单词数（以空格、标点或换行分隔的连续字母数字序列）"""
    # 使用正则表达式匹配单词（连续的字母数字字符）
    words = re.findall(r'\b[a-zA-Z]+\b', text)
    return len(words)

def count_sentences(text):
    """统计句子数（以. ! ?结尾的为一个句子）"""
    # 使用正则表达式匹配句子结尾
    sentences = re.split(r'[.!?]+', text)
    # 过滤空字符串
    sentences = [s.strip() for s in sentences if s.strip()]
    return len(sentences)

def count_code_lines(text):
    """统计代码行数（非空行）"""
    lines = text.split('\n')
    code_lines = [line for line in lines if line.strip() != '']
    return len(code_lines)

def count_blank_lines(text):
    """统计空行数"""
    lines = text.split('\n')
    blank_lines = [line for line in lines if line.strip() == '']
    return len(blank_lines)

def count_comment_lines(text):
    """统计注释行数（以#、//或/*开头的行）"""
    lines = text.split('\n')
    comment_lines = []
    
    for line in lines:
        stripped_line = line.strip()
        # 匹配单行注释（Python、Shell、配置文件中常见）
        if stripped_line.startswith('#') or stripped_line.startswith('//'):
            comment_lines.append(line)
        # 匹配多行注释的开始
        elif stripped_line.startswith('/*'):
            comment_lines.append(line)
        # 匹配多行注释的结束
        elif stripped_line.endswith('*/'):
            comment_lines.append(line)
    
    return len(comment_lines)

def show_help():
    """显示帮助信息"""
    print("文本计数统计程序")
    print("用法: python wc.py [参数] [文件名]")
    print()
    print("基本功能:")
    print("  -c  统计字符数")
    print("  -w  统计单词数")
    print("  -s  统计句子数")
    print()
    print("扩展功能:")
    print("  -cl 统计代码行数")
    print("  -bl 统计空行数")
    print("  -cm 统计注释行数")
    print("  -a  统计所有信息")
    print("  -h  显示此帮助信息")
    print()
    print("示例:")
    print("  python wc.py -c file.txt")
    print("  python wc.py -w file.txt")
    print("  python wc.py -cl program.py")
    print("  python wc.py -a file.txt")

def main():
    # 检查参数数量
    if len(sys.argv) < 2 or sys.argv[1] == '-h':
        show_help()
        return
    
    if len(sys.argv) != 3 and sys.argv[1] != '-a':
        print("错误: 参数数量不正确")
        show_help()
        return
    
    option = sys.argv[1]
    filename = sys.argv[2] if len(sys.argv) == 3 else None
    
    # 检查参数有效性
    valid_options = ['-c', '-w', '-s', '-cl', '-bl', '-cm', '-a']
    if option not in valid_options:
        print(f"错误: 无效的参数 '{option}'")
        print("可用参数: -c, -w, -s, -cl, -bl, -cm, -a")
        return
    
    try:
        # 读取文件
        with open(filename, 'r', encoding='utf-8') as file:
            text = file.read()
        
        # 根据参数进行统计
        if option == '-c':
            count = count_characters(text)
            print(f"文件 '{filename}' 的字符数: {count}")
        elif option == '-w':
            count = count_words(text)
            print(f"文件 '{filename}' 的单词数: {count}")
        elif option == '-s':
            count = count_sentences(text)
            print(f"文件 '{filename}' 的句子数: {count}")
        elif option == '-cl':
            count = count_code_lines(text)
            print(f"文件 '{filename}' 的代码行数: {count}")
        elif option == '-bl':
            count = count_blank_lines(text)
            print(f"文件 '{filename}' 的空行数: {count}")
        elif option == '-cm':
            count = count_comment_lines(text)
            print(f"文件 '{filename}' 的注释行数: {count}")
        elif option == '-a':
            # 统计所有信息
            char_count = count_characters(text)
            word_count = count_words(text)
            sentence_count = count_sentences(text)
            code_line_count = count_code_lines(text)
            blank_line_count = count_blank_lines(text)
            comment_line_count = count_comment_lines(text)
            
            print(f"文件 '{filename}' 的完整统计结果:")
            print("=" * 40)
            print(f"字符数: {char_count}")
            print(f"单词数: {word_count}")
            print(f"句子数: {sentence_count}")
            print("-" * 40)
            print(f"代码行数: {code_line_count}")
            print(f"空行数: {blank_line_count}")
            print(f"注释行数: {comment_line_count}")
            print(f"总行数: {code_line_count + blank_line_count + comment_line_count}")
            
    except FileNotFoundError:
        print(f"错误: 文件 '{filename}' 未找到")
    except Exception as e:
        print(f"错误: 读取文件时发生错误 - {e}")

if __name__ == "__main__":
    main()